// 包含头文件
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/float32.hpp"
#include "base_interfaces_demo/msg/loc_point.hpp" // 包含自定义消息头文件

// 自定义节点类；
class MsgLisnode : public rclcpp::Node
{
public:
  MsgLisnode() : Node("msglisnode_cpp")
  {
    // 订阅话题
    sub_ = this->create_subscription<base_interfaces_demo::msg::LocPoint>(
        "loc_point", 10, std::bind(&MsgLisnode::msg_callback, this, std::placeholders::_1));
    // 发布话题
    msg_pub_ = this->create_publisher<std_msgs::msg::Float32>("y_msg", 10);
  }

private:
  // 订阅回调函数
  void msg_callback(const base_interfaces_demo::msg::LocPoint::SharedPtr msg)
  {
    RCLCPP_INFO(this->get_logger(), "loc_point:(x:%.2f,y:%.2f)", msg->x, msg->y);
    auto pub_msg = std_msgs::msg::Float32();
    pub_msg.data = msg->y;
    msg_pub_->publish(pub_msg);
  }
  rclcpp::Subscription<base_interfaces_demo::msg::LocPoint>::SharedPtr sub_;
  rclcpp::Publisher<std_msgs::msg::Float32>::SharedPtr msg_pub_;
};

int main(int argc, char const *argv[])
{
  // 初始化ROS2客户端；
  rclcpp::init(argc, argv);
  // 调用spain函数，并传入节点对象指针；
  rclcpp::spin(std::make_shared<MsgLisnode>());
  // 资源释放
  rclcpp::shutdown();
  return 0;
}